function Foo() {
    getName=function () {
        console.log(1);
    }
    return this;
}
Foo.getName=function () {
    console.log(2);
};
Foo.prototype.getName=function () {
    console.log(3);
};
var getName=function () {
    console.log(4);
}
function getName() {
    console.log(5);
}
Foo.getName();
getName();
Foo().getName;
getName();
new Foo.getName();//new (Foo.getName)() new Foo() >  Foo() > new Foo
new Foo().getName();
new new Foo().getName();

//如果构造函数和原型链都有相同的方法 默认会拿出构造函数的公有方法而不是原型链
function User(name) {
    var name=name; //私有属性
    this.name=name; //共有属性
    function getName() {//私有方法
        return name;
    }
}
User.prototype.getName=function () {//公有方法
    return this.name;
};
User.name='cat';//静态属性
User.getName=function () {//静态方法
    return this.name;
};
var Cat=new User('cat');//实例化
//调用公有方法 公有属性必须实例化 也就是用new操作符实化对象
// 可构造函数实例化对象的方法和属性
//公有方法不能调用私有方法和静态方法
// 静态方法和属性 无需实例就可以调用 对象的私有方法和属性 外部是不可以访问的


var name='WindowName'; //全局变量
function getName1() {
    name='innerName';//去掉var变成了全局变量
    var privateName='privateName';
    return function () {
        // console.log(this)
        return privateName;
    }
}

var getPrivate=getName1('hello');
console.log(name);
console.log(getPrivate());


function Foo2(name) {
this.name=name
    return {
    age:15
    }
}

console.log(new Foo2('foo'));

var a=[1,{name:'x',age:10}];
var b=a.concat();
b.push(3);
b[1].name='y';
console.log(a);
console.log(b);
async function asyn1() {
    console.log('asyn1 start');
    await asyn2();
    console.log('asyn1 end');
}
async function asyn2() {
    console.log('asyn2');
}
console.log('script start');
setTimeout(function () {
    console.log('setTimeout');
},0);
asyn1();
new Promise(function (resolve) {
    console.log('Promise1');
    resolve()
}).then(function () {
    console.log('Promise2');
});
console.log('script end');



